package com.fqy.ticket.generator.util;

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;

/**
 * Freemarker模板工具类，用于加载模板并生成文件
 */
public class FreemarkerUtil {

    // 模板文件存放路径（Windows路径格式）
    static String ftlPath = "genrerator\\src\\main\\java\\com\\fqy\\ticket\\generator\\ftl\\";

    // 静态模板对象，由initConfig方法初始化
    static Template temp;

    /**
     * 初始化Freemarker配置并加载指定模板
     * @param ftlName 模板文件名称（包含扩展名）
     * @throws IOException 当模板文件不存在或无法访问时抛出
     */
    public static void initConfig(String ftlName) throws IOException {
        // 创建Freemarker配置实例，指定版本
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);

        // 设置模板文件加载路径
        cfg.setDirectoryForTemplateLoading(new File(ftlPath));

        // 设置对象包装器，用于将数据模型中的Java对象转换为Freemarker能理解的格式
        cfg.setObjectWrapper(new DefaultObjectWrapper(Configuration.VERSION_2_3_31));

        // 加载指定名称的模板文件
        temp = cfg.getTemplate(ftlName);
    }

    /**
     * 根据已加载的模板和数据生成文件
     * @param fileName 生成的文件路径和名称
     * @param map 包含模板变量值的映射
     * @throws IOException 当文件写入失败时抛出
     * @throws TemplateException 当模板处理失败时抛出
     */
    public static void generator(String fileName, Map<String, Object> map) throws IOException, TemplateException {
        // 创建文件写入流
        FileWriter fw = new FileWriter(fileName);
        BufferedWriter bw = new BufferedWriter(fw);

        // 将数据模型应用到模板并写入文件
        temp.process(map, bw);

        // 刷新缓冲区并关闭流
        bw.flush();
        fw.close();
    }
}
